package test.bean;

import com.lowagie.text.BadElementException;
import com.lowagie.text.Document;
import com.lowagie.text.DocumentException;
import com.lowagie.text.PageSize;
import com.lowagie.text.Phrase;
import java.io.IOException;
import java.io.Serializable;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import test.dao.CiudadFacade;
import test.entity.Ciudad;

/**
 *
 * @author Fary Hurtado
 */
@ManagedBean
@SessionScoped
public class CiudadBean implements Serializable {

    @EJB
    private CiudadFacade ciudadFacade;
    private Ciudad ciudad = new Ciudad();
    private Connection connection = null;

    // iniciamos la conexión con la base de datos
    public void initConection() throws SQLException {

        try {

            // cargamos el driver
            Class.forName("com.mysql.jdbc.Driver").newInstance();
            if (this.connection == null) {
                // establecemos la conexión
                this.connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/city", "root", "toor");
            }

        } catch (InstantiationException ex) {
            Logger.getLogger(CiudadBean.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            Logger.getLogger(CiudadBean.class.getName()).log(Level.SEVERE, null, ex);
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(CiudadBean.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public void toPdf() {
        ServletOutputStream servletOutputStream = null;
        try {

            initConection();

            // Nos posisionamos en la carpeta [/WEB-INF/] y obtenemos el archivo [reportCity.jasper]
            String path = FacesContext.getCurrentInstance().getExternalContext().getRealPath("WEB-INF/" + "reportCityP.jasper");

            // Generamos un archivo print con los datos de la base de datos
            JasperPrint jasperPrint = JasperFillManager.fillReport(path, null, this.connection);
            // Generamos un archivo .pdf, éste es el reporte
            JasperExportManager.exportReportToPdfFile(jasperPrint, "reporteCitys");

            // Permite que el usuario descargue el archivo
            HttpServletResponse httpServletResponse = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
            httpServletResponse.addHeader("Content-disposition", "attachment; filename=" + "reporteCitys" + ".pdf");
            servletOutputStream = httpServletResponse.getOutputStream();


            JasperExportManager.exportReportToPdfStream(jasperPrint, servletOutputStream);
            FacesContext.getCurrentInstance().responseComplete();


        } catch (IOException ex) {
            Logger.getLogger(CiudadBean.class.getName()).log(Level.SEVERE, null, ex);
        } catch (JRException ex) {
            Logger.getLogger(CiudadBean.class.getName()).log(Level.SEVERE, null, ex);
        } catch (SQLException ex) {
            Logger.getLogger(CiudadBean.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            try {
                if (connection != null) {
                    connection.close();
                }
                if (servletOutputStream != null) {
                    servletOutputStream.close();
                }
            } catch (SQLException ex) {
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error close", "SQL" + ex.getMessage()));
            } catch (IOException ex) {
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error close", "IO " + ex.getMessage()));
            }
        }
    }

    public CiudadBean() {
    }

    public Ciudad getCiudad() {
        return ciudad;
    }

    public List<Ciudad> getCiudades() {

        return this.ciudadFacade.findAll();
    }

    public void addCiudad() {

        try {

            ciudadFacade.create(this.ciudad);
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("¡Enhorabuena! La ciudad, " + this.ciudad.getNombre() + ", ha sido registrada exitosamente"));
            this.ciudad = new Ciudad();

        } catch (Exception exc) {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(exc.getMessage() + "¡Opps! La ciudad: " + this.ciudad.getNombre() + " no ha podido ser registrada"));
        }
    }

    public void removeCiudad() {

        this.ciudadFacade.remove(ciudad);
        this.ciudad = new Ciudad();
    }

    public void preProcessPDF(Object document) throws IOException, BadElementException, DocumentException {
    
        
        
        Document pdf = (Document) document;
        pdf.open();
        pdf.setPageSize(PageSize.A4);

//        ServletContext servletContext = (ServletContext) FacesContext.getCurrentInstance().getExternalContext().getContext();
//        String logo = servletContext.getRealPath("") + File.separator + "images" + File.separator + "prime_logo.png";


        final Phrase phrase = new Phrase("Informe de hembras y machos");
        pdf.add(phrase);


    }
}
